//package com.naiterui.ehp.bs.recommend.dao.impl;
//
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import org.apache.commons.collections4.CollectionUtils;
//import org.springframework.stereotype.Repository;
//
//import com.naiterui.common.repository.hibernate.CompatibleBaseDaoImpl;
//import com.naiterui.common.repository.page.Page;
//import com.naiterui.common.repository.page.PageParamVO;
//import com.naiterui.ehp.bp.utils.lang.StringUtil;
//import com.naiterui.ehp.bs.recommend.bean.DrMedicationRecomInfo;
//import com.naiterui.ehp.bs.recommend.bean.MedicationRecom;
//import com.naiterui.ehp.bs.recommend.dao.IMedicationRecomDao;
//import com.naiterui.ehp.bs.recommend.util.Constants;
//
///**
// * @Description 用药推荐
// */
//@Repository
//public class MedicationRecomDaoImpl extends CompatibleBaseDaoImpl<MedicationRecom, Long> implements IMedicationRecomDao {
//
//    //@Override
//    //public MedicationRecom findBySerialNumber(String serialNumber) {
//    //    List<MedicationRecom> recoms = super.find("from MedicationRecom where serialNumber=?", serialNumber);
//    //    if (!recoms.isEmpty() && recoms.size() > 0) {
//    //        return recoms.get(0);
//    //    }
//    //    return null;
//    //}
//    //
//    //@Override
//    //public long getRecomCount(Long doctorId, Long patientId) {
//    //    return super.getCount("from MedicationRecom where doctorId=? and patientId=? AND type != ?", doctorId, patientId,
//    //            MedicationRecom.RECOM_TYPE_SYSTEM);
//    //}
//    //
//    ///**
//    // * 获取医生推荐用药次数
//    // * MedicationRecomDaoImpl.getRecomCount()
//    // *
//    // * @param doctorId
//    // *
//    // * @return
//    // *
//    // * @Author guoyongxiang
//    // * @Date 2016年2月25日
//    // * @since 2.2.0
//    // */
//    //@Override
//    //public long getRecomCount(Long doctorId) {
//    //    return super.getCount("from MedicationRecom where doctorId=? AND type != ?", doctorId, MedicationRecom.RECOM_TYPE_SYSTEM);
//    //}
//    //
//    //
//    //@Override
//    //public MedicationRecom getMedicationRecomById(Long id) {
//    //    List<MedicationRecom> medicationRecoms = super.find("from MedicationRecom where id=?", id);
//    //    if (null != medicationRecoms && medicationRecoms.size() > 0) {
//    //        return medicationRecoms.get(0);
//    //    }
//    //    return null;
//    //}
//    //
//    //
//    //@Override
//    //public MedicationRecom getMedicationRecomByExtId(Long doctorId, Long patientId, String extId) {
//    //    List<MedicationRecom> recoms = super.find("from MedicationRecom where doctorId=? and patientId=? and extId=?", doctorId, patientId, extId);
//    //    if (recoms != null && recoms.size() > 0) {
//    //        return recoms.get(0);
//    //    }
//    //    return null;
//    //}
//    //
//    //
//    //@Override
//    //public List<MedicationRecom> getMedicationRecomByIds(Set<Long> ids) {
//    //    if (ids != null && ids.size() > 0) {
//    //        return super.find("from MedicationRecom where id in (" + StringUtil.convertListToStr(ids) + ")");
//    //    }
//    //    return null;
//    //}
//    //
//    //@Override
//    //public List<MedicationRecom> getMedicationRecom(Long patientId, Long doctorId, Date start, Date end) {
//    //    StringBuilder buf = new StringBuilder("from MedicationRecom where patientId=? and doctorId=? ");
//    //    Object[] data = new Object[]{ patientId, doctorId };
//    //    if (start != null && end != null) {
//    //        buf.append("and createdAt >= ? and createdAt<=? ");
//    //        data = new Object[]{ patientId, doctorId, start, end };
//    //    }
//    //    buf.append("order by createdAt desc,id desc ");
//    //    return super.find(buf.toString(), data);
//    //}
//    //
//    ///**
//    // * 根据推荐ID及时间获取推荐记录分组
//    // * MedicationRecomDaoImpl.getMedicationRecom()
//    // *
//    // * @param idSet
//    // * @param start
//    // * @param end
//    // *
//    // * @return
//    // *
//    // * @Author guoyongxiang
//    // * @Date 2016年4月5日
//    // * @since 2.2.0
//    // */
//    //
//    //@Override
//    //public Map<Long, MedicationRecom> getMedicationRecomMap(Set<Long> idSet, Date start, Date end) {
//    //    Map<Long, MedicationRecom> map = new HashMap<>();
//    //    if (idSet != null && idSet.size() > 0) {
//    //        String idStr = idSet.toString().substring(1, idSet.toString().length() - 1);
//    //        String hql = "from MedicationRecom where id in (" + idStr + ") ";
//    //        StringBuilder bd = new StringBuilder();
//    //        bd.append(hql);
//    //        List<Object> list = new ArrayList<>();
//    //        if (start != null) {
//    //            bd.append(" and createdAt >= ? ");
//    //            list.add(start);
//    //        }
//    //        if (end != null) {
//    //            bd.append(" and createdAt<=? ");
//    //            list.add(end);
//    //        }
//    //
//    //        List<MedicationRecom> recomList = super.find(bd.toString(), list.toArray());
//    //        for (MedicationRecom recom : recomList) {
//    //            map.put(recom.getId(), recom);
//    //        }
//    //    }
//    //    return map;
//    //}
//    //
//    ///**
//    // * 根据医生ID及时间获取推荐记录分组
//    // * MedicationRecomDaoImpl.getMedicationRecom()
//    // *
//    // * @param idSet
//    // * @param start
//    // * @param end
//    // *
//    // * @return
//    // *
//    // * @Author guoyongxiang
//    // * @Date 2016年4月5日
//    // * @since 2.2.0
//    // */
//    //
//    //@Override
//    //public Map<Long, MedicationRecom> getMedicationRecomByDoctorIdMap(Long doctorId, Set<Long> expIdSet, Date start, Date end) {
//    //    Map<Long, MedicationRecom> map = new HashMap<>();
//    //    List<MedicationRecom> recomList = null;
//    //    if (expIdSet != null && expIdSet.size() > 0) {
//    //        String idStr = expIdSet.toString().substring(1, expIdSet.toString().length() - 1);
//    //        String hql = "from MedicationRecom where doctorId=? and createdAt >= ? and createdAt<=? and not in("
//    //                + idStr.substring(1, idStr.length() - 1) + ")";
//    //        recomList = super.find(hql, doctorId, start, end, idStr);
//    //    } else {
//    //        String hql = "from MedicationRecom where doctorId=? and createdAt >= ? and createdAt<=? ";
//    //        recomList = super.find(hql, doctorId, start, end);
//    //    }
//    //    for (MedicationRecom recom : recomList) {
//    //        map.put(recom.getId(), recom);
//    //    }
//    //    return map;
//    //}
//
//    ///**
//    // * 根据医生ID分页查询推荐记录
//    // * MedicationRecomDaoImpl.getRecomsByPage()
//    // *
//    // * @param doctorId
//    // * @param pageVO
//    // *
//    // * @return
//    // *
//    // * @Author guoyongxiang
//    // * @Date 2016年2月27日
//    // * @since 2.2.0
//    // */
//    //@Override
//    //public Page<MedicationRecom> getRecomsByPage(Long doctorId, Set<Long> patientIds, PageParamVO pageVO) {
//    //    String idsStr = "0";
//    //    if (patientIds != null && patientIds.size() > 0) {
//    //        idsStr = patientIds.toString();
//    //        idsStr = idsStr.substring(1, idsStr.length() - 1);
//    //    }
//    //    return super.pagedQuery("from MedicationRecom where doctorId=? and type<>? and patientId in (" + idsStr
//    //                    + ") and forceRecom<>? order by createdAt desc", pageVO.getPage(), pageVO.getNum(), doctorId,
//    //            MedicationRecom.RECOM_TYPE_SYSTEM,
//    //            MedicationRecom.FORCE_RECOM_STATUS_NOT_SEND);
//    //}
//
//    ///*
//    // * 更新推荐购药成单状态
//    // * IMedicationRecomDao.updateRecomStatus()
//    // */
//    //@Override
//    //public void updateRecomStatus(Set<Long> recomIds, Integer status) {
//    //
//    //    if (null != recomIds && !recomIds.isEmpty()) {
//    //        String recomIdStr = recomIds.toString();
//    //        recomIdStr = recomIdStr.substring(1, recomIdStr.length() - 1);
//    //        String updateSql = "update dr_medication_recom SET status = " + status + " WHERE id IN (" + recomIdStr + ")";
//    //        super.executeSQL(updateSql);
//    //    }
//    //
//    //}
//
//    /*
//     * 获取推荐用药记录集合
//     * IMedicationRecomDao.getTimeLimitRecom()
//     */
//    @Override
//    public List<MedicationRecom> getTimeLimitRecom(Date starTime, Date endTime, Integer recomStatus) {
//
//        List<MedicationRecom> resultList = new ArrayList<>();
//        String queryHql = " SELECT recom FROM MedicationRecom  recom ,DrMedicationRecomInfo info   WHERE recom.id = info.recommendId AND  info" +
//                ".checkingStatus !="
//                + DrMedicationRecomInfo.CHECKING_STATUS_IN + " AND info.checkingStatus !=" + DrMedicationRecomInfo.CHECKING_STATUS_NOT_PASS
//                + " AND recom.forceRecom !=" + MedicationRecom.FORCE_RECOM_STATUS_NOT_SEND;
//        if (null != starTime && null != endTime && null != recomStatus) {
//            queryHql = queryHql + " AND info.changedAt >= ? AND info.changedAt < ? AND recom.status = ?";
//            resultList = super.find(queryHql, starTime, endTime, recomStatus);
//        } else if (null != recomStatus) {
//            queryHql = queryHql + " AND recom.status = ?";
//            resultList = super.find(queryHql, recomStatus);
//        }
//
//        return resultList;
//    }
//
//    /**
//     * 指定时间范围有过推药记录的医生
//     * MedicationRecomDaoImpl.getDoctorIds()
//     *
//     * @param startTime
//     * @param endTime
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016-5-10
//     * @since 1.0.0
//     */
//    @Override
//    public List<Long> getDoctorIds(String startTime, String endTime) {
//        String hql = "select distinct(doctorId) from MedicationRecom where createdAt >= '" + startTime + "' and createdAt <= '" + endTime + "'";
//        List<Long> list = super.findForAny(hql);
//        return list;
//    }
//
//    /**
//     * 根据医生ID以及其实结束时间获取医生推荐数量
//     * MedicationRecomDaoImpl.getDrNumByDr()
//     *
//     * @param doctorId
//     * @param start
//     * @param end
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016-3-29
//     * @since 1.0.0
//     */
//    @Override
//    public Integer getDrNumByDr(Long doctorId, Date start, Date end, Integer status) {
//        String hql = "select COUNT(*) from MedicationRecom where doctorId=? and createdAt >= ? and createdAt <= ?";
//        List countlist = null;
//        try {
//            if (null != status) {
//                hql += " and status=?";
//                countlist = super.find(hql, doctorId, start, end, status);
//            } else {
//                countlist = super.find(hql, doctorId, start, end);
//            }
//
//            if (null != countlist && !countlist.isEmpty()) {
//                Integer totalCount = Integer.parseInt(countlist.get(0) + "");
//                return totalCount;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0;
//        }
//        return 0;
//    }
//
//    /**
//     * 根据医生ID获取医生推荐数量
//     * MedicationRecomDaoImpl.getDrNumByDr()
//     *
//     * @param doctorId
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016年6月28日
//     * @since 1.0.0
//     */
//
//    @Override
//    public Integer getDrNumByDr(Long doctorId) {
//        String hql = "select COUNT(*) from MedicationRecom where doctorId=?";
//        List countlist = null;
//        try {
//            countlist = super.find(hql, doctorId);
//            if (null != countlist && !countlist.isEmpty()) {
//                Integer totalCount = Integer.valueOf(countlist.get(0) + "");
//
//                return totalCount;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0;
//        }
//        return 0;
//    }
//
//    /**
//     * 根据医生ID获取医生推荐数量
//     * MedicationRecomDaoImpl.getDrNumByDr()
//     *
//     * @param doctorId
//     * @param status
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016年6月27日
//     * @since 1.0.0
//     */
//
//    @Override
//    public Long getDrNumByDr(Long doctorId, Integer status) {
//        String hql = "select COUNT(*) from MedicationRecom where doctorId= " + doctorId;
//        List countlist = null;
//        try {
//            if (null != status) {
//                hql += " and status= " + status;
//                countlist = super.find(hql);
//            } else {
//                countlist = super.find(hql);
//            }
//
//            if (null != countlist && !countlist.isEmpty()) {
//                Long totalCount = (Long) countlist.get(0);
//                return totalCount;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0L;
//        }
//        return 0L;
//    }
//
//    /**
//     * 翻页查找推荐记录
//     * MedicationRecomDaoImpl.getPageRecom()
//     *
//     * @param doctorId
//     * @param start
//     * @param end
//     * @param status
//     * @param pageVO
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016-3-30
//     * @since 1.0.0
//     */
//
//    @Override
//    public Page<MedicationRecom> getPageRecom(Long doctorId, Date start, Date end, Integer status, PageParamVO pageVO) {
//        StringBuilder hql = new StringBuilder(" from MedicationRecom where 1=1 and doctorId=? and status = ? ");
//        Page<MedicationRecom> pageRecom = null;
//        try {
//
//            if (null == start && null == end) {
//                pageRecom = super.pagedQuery(hql.toString(), pageVO.getPage(), pageVO.getNum(), doctorId, status);
//            } else if (null != start && null == end) {
//                hql.append(" and createdAt >= ? ");
//                pageRecom = super.pagedQuery(hql.toString(), pageVO.getPage(), pageVO.getNum(), doctorId, status, start);
//            } else if (null == start && null != end) {
//                hql.append(" and createdAt <= ? ");
//                pageRecom = super.pagedQuery(hql.toString(), pageVO.getPage(), pageVO.getNum(), doctorId, status, end);
//            } else if (null != start && null != end) {
//                hql.append(" and createdAt >= ? and createdAt <= ? ");
//                pageRecom = super.pagedQuery(hql.toString(), pageVO.getPage(), pageVO.getNum(), doctorId, status, start, end);
//            }
//            hql.append(" orer by createdAt desc");
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//        return pageRecom;
//    }
//
//    /**
//     * 根据医生id翻页获取推荐记录
//     *
//     * @param doctorId
//     * @param pageParam
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016-4-20
//     * @since 1.0.0
//     */
//
//    @Override
//    public Page<MedicationRecom> findRecoms(Long doctorId, PageParamVO pageParam, String startTime, String endTime) {
//        StringBuilder hql = new StringBuilder(" from MedicationRecom where 1=1 ");
//        int page = pageParam.getPage();
//        int num = pageParam.getNum();
//        // 参数列表
//        int totalCount = 0;
//        List<MedicationRecom> resultList = new ArrayList<>();
//        Page<MedicationRecom> recomPage = null;
//        hql.append(" and doctorId= ").append(doctorId);
//
//        try {
//            if (null != startTime && !"".equals(startTime)) {
//                startTime += " 00:00:00";
//                hql.append(" and createdAt>='" + startTime + "'");
//            }
//            if (null != endTime && !"".equals(endTime)) {
//                endTime += " 23:59:59";
//                hql.append(" and createdAt<= '" + endTime + "'");
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        hql.append(" order by createdAt desc");
//        recomPage = super.pagedQuery(hql.toString(), pageParam.getPage(), pageParam.getNum());
//        // 构建分页对象
//        Page<MedicationRecom> pageVO = new Page<>();
//        if (null != recomPage) {
//            pageVO.setTotalCount(recomPage.getTotalCount());
//            pageVO.setResult(recomPage.getResult());
//        } else {
//            pageVO.setTotalCount(totalCount);
//            pageVO.setResult(resultList);
//        }
//        pageVO.setPageNo(page);
//        pageVO.setPageSize(num);
//
//        // 构建分页对象
//        return pageVO;
//    }
//
//    @Override
//    public Page<MedicationRecom> getRecomsByPatient(Long patientId, Long doctorId, Long sessionId, int page, int num) {
//        Object[] values = new Object[]{ patientId };
//        // 默认查患者所有的推药记录
//        String hql = "FROM MedicationRecom where patientId = ?";
//        if (sessionId != null && doctorId == null) { // 查制定会话里的推药记录
//            hql += " and sessionId = ?";
//            values = new Object[]{ patientId, sessionId };
//        } else if (sessionId == null && doctorId != null) {// 查询与某医生的所有推药记录
//            hql += " and doctorId = ?";
//            values = new Object[]{ patientId, doctorId };
//        } else if (sessionId != null && doctorId != null) { // 查询某医生指定会话的推药记录（貌似没有这个场景）
//            hql += " and sessionId = ? and doctorId = ?";
//            values = new Object[]{ patientId, sessionId, doctorId };
//        }
//        hql += " ORDER BY createdAt DESC";
//        Page<MedicationRecom> recoms = this.pagedQuery(hql, page, num, values);
//        return recoms;
//    }
//
//    /**
//     * 根据医生ID获取医生推荐数量
//     * MedicationRecomDaoImpl.getDrNumByDrNoTime()
//     *
//     * @param doctorId
//     * @param status
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016年7月5日
//     * @since 1.0.0
//     */
//
//    @Override
//    public Integer getDrNumByDrNoTime(Long doctorId, Integer status) {
//        String hql = "select COUNT(*) from MedicationRecom where doctorId=?";
//        List countlist = null;
//        try {
//            if (null != status) {
//                hql += " and status=?";
//                countlist = super.find(hql, doctorId, status);
//            } else {
//                countlist = super.find(hql, doctorId);
//            }
//
//            if (null != countlist && !countlist.isEmpty()) {
//                Integer totalCount = Integer.valueOf(countlist.get(0) + "");
//                return totalCount;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0;
//        }
//        return 0;
//    }
//
//    /**
//     * 根据医生ID获取医生推荐数量
//     * MedicationRecomDaoImpl.getDrNumByDrId()
//     *
//     * @param doctorId
//     *
//     * @return
//     *
//     * @Author fangguanhong
//     * @Date 2016年7月12日
//     * @since 1.0.0
//     */
//
//    @Override
//    public Long getDrNumByDrId(Long doctorId) {
//        String hql = "select COUNT(*) from MedicationRecom where doctorId= " + doctorId;
//        List countlist = null;
//        try {
//            countlist = super.find(hql);
//
//            if (null != countlist && !countlist.isEmpty()) {
//                Long totalCount = (Long) countlist.get(0);
//                return totalCount;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0L;
//        }
//        return 0L;
//    }
//
//
//    @Override
//    public List<MedicationRecom> getMedicationRecomByRequire(Long requireId) {
//        String hql = "FROM MedicationRecom where requireId = ?";
//        if (null != requireId) {
//            return super.find(hql, requireId);
//        }
//        return null;
//    }
//
//
//    @Override
//    public MedicationRecom getByLock(Long recomId) {
//
//        MedicationRecom recom = null;
//        List<MedicationRecom> recomList = super.findByLock("from MedicationRecom where id=?", recomId);
//        if (CollectionUtils.isNotEmpty(recomList)) {
//            recom = recomList.get(0);
//        }
//        return recom;
//    }
//
//    /**
//     * 获取未删除的推荐记录
//     *
//     * @param doctorId
//     * @param patientId
//     * @param lastRecommendId
//     * @param pageVO
//     *
//     * @return
//     *
//     * @Date 2017年12月20日
//     * @since 2.14
//     */
//    @Override
//    public Page<MedicationRecom> getRecomsVisiableByPage(Long doctorId, Long patientId, PageParamVO pageVO) {
//        StringBuilder builder = new StringBuilder();
//        builder.append(
//                "SELECT alias.* FROM (SELECT recom.* FROM dr_medication_recom recom LEFT JOIN dr_medication_recom_info info ON recom.id = info" +
//                        ".recommend_id");
//        builder.append(" WHERE recom.doctor_id = ? AND recom.patient_id = ? AND recom.force_recom <> ? AND recom.type <> ? AND recom.visiable = ? ");
//        //过滤已作废的数据
//        builder.append(" AND recom.invalid <> ? ");
//        builder.append(
//                "  AND (info.checking_status <> ? AND info.checking_status <> ? OR info.checking_status IS NULL) ORDER BY recom.id DESC ) as alias");
//        String sql = builder.toString();
//        List<Object> params = new ArrayList<>();
//        params.add(doctorId);
//        params.add(patientId);
//        params.add(MedicationRecom.FORCE_RECOM_STATUS_NOT_SEND);
//        params.add(MedicationRecom.RECOM_TYPE_SYSTEM);
//        params.add(Constants.STATUS_NO);
//        params.add(MedicationRecom.INVALID_YES);
//        params.add(DrMedicationRecomInfo.CHECKING_STATUS_IN);
//        params.add(DrMedicationRecomInfo.CHECKING_STATUS_NOT_PASS);
//        return super.pagedSqlQueryOffset(MedicationRecom.class, sql, pageVO.getPage(), pageVO.getNum(), pageVO.getOffset(), params.toArray());
//
//    }
//
//
//    @Override
//    public List<MedicationRecom> getMedicationRecomByRequireId(Long requireId) {
//        String hql = "FROM MedicationRecom where requireId = ? and (forceRecom = ? or forceRecom = ?) order by createdAt desc";
//        if (null != requireId) {
//            return super.find(hql, requireId, MedicationRecom.FORCE_RECOM_STATUS_SEND, MedicationRecom.FORCE_RECOM_STATUS_FORCE_SEND);
//        }
//        return null;
//    }
//
//    /**
//     * 获取待审核未失效处方
//     *
//     * @return
//     */
//    @Override
//    public List<Long> getPendingRecom() {
//        return super.sqlQuery(Long.class, "select r.id from dr_medication_recom r join recom_audit_log a on r.id=a.recom_id and a" +
//                ".status=0 and r.expire_at<now() order by id desc limit 100");
//    }
//
//}
